/* 无法避免全局变量造成的污染，TypeScript提供了namespace 避免这个问题出现

内部模块，主要用于组织代码，避免命名冲突。
命名空间内的类默认私有
通过 export 暴露
通过 namespace 关键字定义

任何包含顶级import或者export的文件都被当成一个模块。
相反地，如果一个文件不带有顶级的import或者export声明，
那么它的内容被视为全局可见的（因此对模块也是可见的）

 */
namespace aA1 {
  export const Time: number = 1000
  export const fn = <T>(arg: T): T => {
    return arg
  }
  fn(Time)
}

namespace bB1 {
  //不用export 导出是无法读取其值的
  export const Time: number = 1000
  export const fn = <T>(arg: T): T => {
    return arg
  }
  fn(Time)
}

aA1.Time
bB1.Time
// ps1 嵌套命名空间
namespace aA2 {
  export namespace b {
    export class Vue {
      parameters: string
      constructor(parameters: string) {
        this.parameters = parameters
      }
    }
  }
}

let vA2 = aA2.b.Vue

new vA2('1')

// ps2 抽离命名空间
// a.ts
export namespace V {
  export const a = 1
}
// b.ts
// import {V} from './a'
// console.log(V);

// ps3 简化命名空间
namespace A {
  export namespace B {
    export const C = 1
  }
}

import X = A.B.C
console.log(X)

//ps4 合并命名空间 :重名的命名空间会合并
namespace AV {
  export const aV1 = 1
}
namespace AV {
  export const aV2 = 1
}
AV.aV1
AV.aV2
